﻿//using System.Collections.Generic;
//using System.IO;

//namespace Wizard.Compiler.Tokenizers
//{
//    internal class SourceReader
//    {

//        private readonly Stack<SourcePos> mSourcePosStack;
//        private SourcePos mCurrentPos;
//        private BaseTokenizer mCurrentTokenizer;

//        internal SourceReader()
//        {
//            mSourcePosStack = new Stack<SourcePos>();
//        }

//        public string Name
//        {
//            get { return mCurrentPos.Name; }
//        }

//        public int Line
//        {
//            get { return mCurrentPos.Line; }
//        }

//        public int Column
//        {
//            get { return mCurrentPos.Column; }
//        }

//        public void PushExprString(string name, string source, Language language)
//        {
//            ITokenizerSource src = new StringSource(name, source);
//            if (mCurrentPos != null) mSourcePosStack.Push(mCurrentPos);
//        //    mCurrentPos = new SourcePos(src, null, language);
//        }

//        public void PushFileSource(string filename)
//        {
//            ITokenizerSource src = new FileSource(filename);
//            if (mCurrentPos != null) mSourcePosStack.Push(mCurrentPos);
//            Language language;
//            string ext = Path.GetExtension(filename).ToLower();
//            switch (ext)
//            {
//                case ".bas":
//                case ".vb":
//                    language = Language.Basic;
//                    break;
//                case ".c":
//                case ".cs":
//                case ".cpp":
//                case ".java":
//                    language = Language.Java;
//                    break;
//                case ".pas":
//                    language = Language.Pascal;
//                    break;
//                default:
//                    throw new Engine.WizardException(string.Format("Unknown file extension {0}.", ext));
//            }
//         //   mCurrentPos = new SourcePos(src, null, language);
//        }

//        public int ReadChar()
//        {
//            var result = mCurrentPos.ReadChar();
//            while (result == -1 && mSourcePosStack.Count > 0)
//            {
//                mCurrentPos = mSourcePosStack.Pop();
//                result = mCurrentPos.ReadChar();
//            }
//            return result;
//        }

//        #region Nested type: FileSource

//        private class FileSource : ITokenizerSource
//        {
//            private readonly string mFilename;
//            private readonly StreamReader mSr;

//            public FileSource(string filename)
//            {
//                mFilename = filename;
//                mSr = new StreamReader(mFilename);
//            }

//            #region ISource Members

//            string ITokenizerSource.Name
//            {
//                get { return mFilename; }
//            }

//            int ITokenizerSource.ReadChar()
//            {
//                return mSr.Read();
//            }

//            #endregion
//        }

//        #endregion

//        #region Nested type: StringSource

//        private class StringSource : ITokenizerSource
//        {
//            private readonly string mName;
//            private readonly string mSource;
//            private readonly StringReader mSourceReader;

//            public StringSource(string name, string source)
//            {
//                mName = name;
//                mSource = source;
//                mSourceReader = new StringReader(mSource);
//            }

//            #region ISource Members

//            string ITokenizerSource.Name
//            {
//                get { return mName; }
//            }

//            int ITokenizerSource.ReadChar()
//            {
//                return mSourceReader.Read();
//            }

//            #endregion
//        }

//        #endregion

//        internal BaseTokenizer CurrentTokenizer
//        {
//            get { return mCurrentPos.Tokenizer; }

//        }
//    }
//}